/**
 * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
 * 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？
 *递归减枝（即递归去优化，将重复计算的值用数组存起来即可，如果递归到重复计算的值，直接返回即可）
 *
 */
class ClimbStairsDiGuiJianZhi {
    
    public int climbStairs(int n) {
        int[] meo=new int[n+1];
        climbStairs(n,meo);
        return meo[n];
    }
    public int climbStairs(int n,int[] meo){
        if(n<0){
            return 0;
        }
        if(n==0){
            return 1;
        }
        if(meo[n]!=0){
            return meo[n];//如果meo[n]！=0说明已经求过，那么直接返回即可，不用再求一遍
        }
        meo[n]=climbStairs(n-1,meo)+climbStairs(n-2,meo);
        return meo[n];
    }
}